#include "drv_led.h"

#define DRV_LED1_PIN            LL_GPIO_PIN_1
#define DRV_LED2_PIN            LL_GPIO_PIN_6
#define DRV_LED3_PIN            LL_GPIO_PIN_0
#define DRV_LED4_PIN            LL_GPIO_PIN_1
#define DRV_LED5_PIN            LL_GPIO_PIN_1
#define DRV_LED6_PIN            LL_GPIO_PIN_3
#define DRV_LED7_PIN            LL_GPIO_PIN_0

#define DRV_LED1_PORT           GPIOA
#define DRV_LED2_PORT           GPIOA
#define DRV_LED3_PORT           GPIOB
#define DRV_LED4_PORT           GPIOB
#define DRV_LED5_PORT           GPIOF
#define DRV_LED6_PORT           GPIOF
#define DRV_LED7_PORT           GPIOF

void drv_led_init(void)
{
    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);     
    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB); 
    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOF); 

    LL_GPIO_InitTypeDef GPIO_InitStruct = {0x00};
    GPIO_InitStruct.Pin         = DRV_LED1_PIN;
    GPIO_InitStruct.Mode        = LL_GPIO_MODE_OUTPUT;
    GPIO_InitStruct.Speed       = LL_GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.OutputType  = LL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.Pull        = LL_GPIO_PULL_NO;
    LL_GPIO_Init(DRV_LED1_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED2_PIN;
    LL_GPIO_Init(DRV_LED2_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED3_PIN;
    LL_GPIO_Init(DRV_LED3_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED4_PIN;
    LL_GPIO_Init(DRV_LED4_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED5_PIN;
    LL_GPIO_Init(DRV_LED5_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED6_PIN;
    LL_GPIO_Init(DRV_LED6_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin         = DRV_LED7_PIN;
    LL_GPIO_Init(DRV_LED7_PORT, &GPIO_InitStruct);    
}

void drv_led_set(drv_led_t led, drv_led_state_t state)
{
    ret_if_true(led > DRV_LED_MAX);

    unsigned int lpin[] = {
        DRV_LED1_PIN, DRV_LED2_PIN,  DRV_LED3_PIN, DRV_LED4_PIN, DRV_LED5_PIN, DRV_LED6_PIN, DRV_LED7_PIN
    };

    GPIO_TypeDef *lport[] = {
        DRV_LED1_PORT, DRV_LED2_PORT, DRV_LED3_PORT, DRV_LED4_PORT, DRV_LED5_PORT, DRV_LED6_PORT, DRV_LED7_PORT
    };

    if (state == DRV_LED_OFF) {
        LL_GPIO_ResetOutputPin(lport[led], lpin[led]);
    } else {
        LL_GPIO_SetOutputPin(lport[led], lpin[led]);
    }
}

void drv_led_toggle(drv_led_t led)
{
    ret_if_true(led > DRV_LED_MAX);

    unsigned int lpin[] = {
        DRV_LED1_PIN, DRV_LED2_PIN, DRV_LED3_PIN, DRV_LED4_PIN, DRV_LED5_PIN, DRV_LED6_PIN, DRV_LED7_PIN
    };

    GPIO_TypeDef *lport[] = {
        DRV_LED1_PORT, DRV_LED2_PORT, DRV_LED3_PORT, DRV_LED4_PORT, DRV_LED5_PORT, DRV_LED6_PORT, DRV_LED7_PORT
    };

    LL_GPIO_TogglePin(lport[led], lpin[led]);
}



